/*
 * @Author: 霍格沃兹测试开发学社
 * @Desc: '更多测试开发技术探讨，请访问：https://ceshiren.com/t/topic/15860'
 */

package com.ceshiren.aitestmini.controller;

import com.alibaba.fastjson.JSONObject;
import com.ceshiren.aitestmini.dto.AddHogwartsTestCaseDto;
import com.ceshiren.aitestmini.dto.task.*;
import com.ceshiren.aitestmini.entity.HogwartsTestCase;
import com.ceshiren.aitestmini.entity.HogwartsTestTask;
import com.ceshiren.aitestmini.service.ProjectService;
import com.ceshiren.aitestmini.util.R;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Objects;

@Slf4j
@RestController
@RequestMapping("/project")
public class ProjectController {

    @Value("${jenkins.callbackurl}")
    private String jenkinsCallbackUrl;

    @Autowired
    ProjectService projectService;

    /**
     *
     * @param addHogwartsTestCaseDto
     * @return
     */
    @ApiOperation(value = "新增用例")
    @PostMapping("case")
    public R addCase(@RequestBody AddHogwartsTestCaseDto addHogwartsTestCaseDto){

        //参数校验
        if(Objects.isNull(addHogwartsTestCaseDto)){
            return R.error().message("参数不能为空");
        }
        if(!StringUtils.hasText(addHogwartsTestCaseDto.getCaseName())){
            return R.error().message("用例名称不能为空");
        }
        if(!StringUtils.hasText(addHogwartsTestCaseDto.getCaseData())){
            return R.error().message("用例数据不能为空");
        }

        HogwartsTestCase hogwartsTestCase = new HogwartsTestCase();
        BeanUtils.copyProperties(addHogwartsTestCaseDto, hogwartsTestCase);
        return projectService.addCase(hogwartsTestCase);
    }

    /**
     *
     * @param testTaskDto
     * @return
     */
    @ApiOperation(value = "创建任务")
    @PostMapping("task")
    public R createTask(@RequestBody TestTaskDto testTaskDto){

        log.info("添加任务-入参= "+ JSONObject.toJSONString(testTaskDto));
        //参数校验
        if(Objects.isNull(testTaskDto)){
            return R.error().message("参数不能为空");
        }

        AddHogwartsTestTaskDto testTask = testTaskDto.getTestTask();
        if(Objects.isNull(testTask)){
            return R.error().message("任务参数不能为空");
        }
        if(!StringUtils.hasText(testTask.getName())){
            return R.error().message("任务名称不能为空");
        }
        if(Objects.isNull(testTaskDto.getCaseIdList()) || testTaskDto.getCaseIdList().size()==0){
            return R.error().message("用例列表不能为空");
        }

        return projectService.createTask(testTaskDto);
    }

    /**
     *
     * @param caseId
     * @return
     */
    @ApiOperation(value = "获取用例数据")
    @GetMapping("case/data/{caseId}")
    public String getById(@PathVariable Integer caseId){

        HogwartsTestCase hogwartsTestCase = new HogwartsTestCase();
        hogwartsTestCase.setId(caseId);

        String caseData = projectService.getCaseById(hogwartsTestCase);

        if(!StringUtils.hasText(caseData)){
            return "数据不存在";
        }

        return caseData;
    }

    /**
     *
     * @param startTestDto
     * @return
     */
    @PostMapping("/run")
    @ApiOperation(value = "执行测试")
    public R runTask(@RequestBody StartTestDto startTestDto) throws IOException, URISyntaxException {
        log.info("=====执行测试-请求入参====："+ JSONObject.toJSONString(startTestDto));

        //参数校验
        if(Objects.isNull(startTestDto)){
            return R.error().message("参数不能为空");
        }

        if(Objects.isNull(startTestDto.getTaskId())){
            return R.error().message("任务id不能为空");
        }

        HogwartsTestTask hogwartsTestTask = new HogwartsTestTask();
        hogwartsTestTask.setId(startTestDto.getTaskId());
        hogwartsTestTask.setTestCommand(startTestDto.getTestCommand());

        RequestInfoDto requestInfoDto = new RequestInfoDto();
        requestInfoDto.setRequestUrl(jenkinsCallbackUrl);
        requestInfoDto.setBaseUrl(jenkinsCallbackUrl);

        return projectService.runTask(requestInfoDto, hogwartsTestTask);
    }

    /**
     *
     * @param updateHogwartsTestTaskStatusDto
     * @return
     */
    @ApiOperation(value = "修改任务状态")
    @PutMapping("task/status")
    public R updateStatus(@RequestBody UpdateHogwartsTestTaskStatusDto updateHogwartsTestTaskStatusDto){

        //参数校验
        if(Objects.isNull(updateHogwartsTestTaskStatusDto)){
            return R.error().message("参数不能为空");
        }

        if(Objects.isNull(updateHogwartsTestTaskStatusDto.getTaskId())){
            return R.error().message("任务id不能为空");
        }

        if(Objects.isNull(updateHogwartsTestTaskStatusDto.getStatus())){
            return R.error().message("状态不能为空");
        }
        if(!StringUtils.hasText(updateHogwartsTestTaskStatusDto.getBuildUrl())){
            return R.error().message("构建地址不能为空");
        }

        HogwartsTestTask hogwartsTestTask = new HogwartsTestTask();
        hogwartsTestTask.setId(updateHogwartsTestTaskStatusDto.getTaskId());
        hogwartsTestTask.setStatus(updateHogwartsTestTaskStatusDto.getStatus());
        hogwartsTestTask.setBuildUrl(updateHogwartsTestTaskStatusDto.getBuildUrl());

        return projectService.updateStatus(hogwartsTestTask);
    }

    /**
     *
     * @param taskId
     * @return
     */
    @ApiOperation(value = "获取报告")
    @GetMapping("/report/{taskId}")
    public R getReport(@PathVariable Integer taskId){

        return projectService.getReport(taskId);
    }

    /**
     *
     * @return
     */
    @ApiOperation(value = "用例列表查询")
    @GetMapping("case/list")
    public R<HogwartsTestCase> listCase(){
        return projectService.listCase();
    }

    /**
     *
     * @return
     */
    @ApiOperation(value = "任务列表查询")
    @GetMapping("task/list")
    public R<HogwartsTestTask> listTask(){
        return projectService.listTask();
    }

}
